﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Documentos.Entities;
using HerGoS.DAO;
using HerGoS.Interfaces;
using System.Data;
using HerGoS.Administration.Entities;
using HerGoS.Documentos.Exceptions;
using HerGoS.Administration.Engine;

namespace HerGoS.Documentos.Engine
{
   public  class GestorLegajoDocumento
    {

       public static LegajoDocumento Obtener(int OID)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryDocumentosName);
               repo.Nombre = "LEGAJODOCUMENTOS_SP";
               repo.AddParameter("@ACCION", "BYID");
               repo.AddParameter("@ID", OID);
               DataTable dt = repo.ExecuteDataTable();
               LegajoDocumento result = dt.ToGenericList<LegajoDocumento>(LegajoDocumentoConverter).FirstOrDefault();
               return result;
           }
           catch (Exception ex)
           {
               throw new ProcesoGetException(ex);
           }

       }

       public static void Guardar(LegajoDocumento legajodocumento)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryDocumentosName);
               repo.Nombre = "LEGAJODOCUMENTOS_PROC";
               repo.AddParameter("@ACCION ", legajodocumento.Persistencia);
               repo.AddParameter("@ID", legajodocumento.OID);
               repo.AddParameter("@NUMERO", legajodocumento.Numero);
               repo.AddParameter("@ANO", legajodocumento.Ano);
               repo.AddParameter("@COPIA", legajodocumento.Copia);
               repo.AddParameter("@REFERENCIA", legajodocumento.Referencia);
               repo.AddParameter("@FECHAINICIO", legajodocumento.FechaInicio);
               repo.AddParameter("@ANEXOS", legajodocumento.Anexos);
               repo.AddParameter("@CUERPOS", legajodocumento.Cuerpos);
               repo.AddParameter("@FOLIOS", legajodocumento.Folios);
               repo.AddParameter("@IDENTIDADINICIADORA", legajodocumento.EntidadIniciadora == null ? (int?) null : legajodocumento.EntidadIniciadora.OID);
               repo.AddParameter("@IDPROCESO", legajodocumento.Proceso == null ? (int?)null : legajodocumento.Proceso.OID);
               repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
               legajodocumento.OID = repo.ExecuteReturnValue().ToInteger();
               repo.Commit();

               //GestorBitacora.Guardar(legajodocumento);

           }
           catch (Exception ex)
           {
               throw new LegajoDocumentoSaveException(ex);
           }
       }

        public static void Eliminar(LegajoDocumento legajoDocumento)
       {
           legajoDocumento.Persistencia = EstadoPersistencia.DELETE;
           Guardar(legajoDocumento);
           legajoDocumento.Persistencia = EstadoPersistencia.UPDATE;
           legajoDocumento.Activo = false;
       }

        public static void ReActivar(LegajoDocumento legajoDocumento)
        {
            legajoDocumento.Persistencia = EstadoPersistencia.UNDELETE;
            Guardar(legajoDocumento);
            legajoDocumento.Persistencia = EstadoPersistencia.UPDATE;
            legajoDocumento.Activo = true;
        }

        public static List<LegajoDocumento> Consultar(LegajoDocumentoDTO legajoDocumentoDTO)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryDocumentosName);
                repo.Nombre = "LEGAJODOCUMENTOS_SP";
                repo.AddParameter("@ACCION", "CONSULTA");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@NUMERO", legajoDocumentoDTO.Numero == 0 ?(int?) null : legajoDocumentoDTO.Numero);
                repo.AddParameter("@ANO", legajoDocumentoDTO.Ano == 0 ? (int?)null : legajoDocumentoDTO.Ano);
                repo.AddParameter("@COPIA", legajoDocumentoDTO.Copia == 0 ? (int?)null : legajoDocumentoDTO.Copia);
                repo.AddParameter("@REFERENCIA", legajoDocumentoDTO.Referencia);
                repo.AddParameter("@FECHAINICIO", legajoDocumentoDTO.FechaInicio);
                repo.AddParameter("@ANEXOS", legajoDocumentoDTO.Anexos == 0 ? (int?)null : legajoDocumentoDTO.Anexos);
                repo.AddParameter("@CUERPOS", legajoDocumentoDTO.Cuerpos == 0 ? (int?)null : legajoDocumentoDTO.Cuerpos);
                repo.AddParameter("@FOLIOS", legajoDocumentoDTO.Folios == 0 ? (int?)null : legajoDocumentoDTO.Folios);
                repo.AddParameter("@IDENTIDADINICIADORA", legajoDocumentoDTO.EntidadIniciadora == null ? (int?)null : legajoDocumentoDTO.EntidadIniciadora.OID);
                repo.AddParameter("@IDPROCESO", legajoDocumentoDTO.Proceso == null ? (int?)null : legajoDocumentoDTO.Proceso.OID);
                repo.AddParameter("@ACTIVO", legajoDocumentoDTO.Activo);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                DataTable dt = repo.ExecuteDataTable();
                List<LegajoDocumento> result = dt.ToGenericList<LegajoDocumento>(LegajoDocumentoConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new ProcesoGetException(ex);
            }
        }

        public static List<LegajoDocumento> Consultar()
        {
            LegajoDocumentoDTO legajodocumentoDTO = new LegajoDocumentoDTO{ Activo = true };
            return Consultar(legajodocumentoDTO);
        }

    




       #region Converter
       public static LegajoDocumento LegajoDocumentoConverter(DataRow row)
       {
           try
           {
               return new LegajoDocumento
               {
                   OID = row["lvdID"].ToInteger(),
                   Persistencia = EstadoPersistencia.UPDATE,
                   Numero = row["lvdNUMERO"].ToInteger(),
                   Ano = row["lvdANO"].ToInteger(),
                   Copia = row["lvdCOPIA"].ToInteger(),
                   Referencia = row["lvdREFERENCIA"].ToString(),
                   FechaInicio = row["lvdFECHAINICIO"].ToDateTime(),
                   Anexos = row["lvdANEXOS"].ToInteger(),
                   Cuerpos = row["lvdCUERPOS"].ToInteger(),
                   Folios = row["lvdFOLIOS"].ToInteger(),
                   EntidadIniciadora = GestorEntidades.Obtener(row["lvdIDENTIDADINICIADORA"].ToInteger()),
                   Proceso = GestorProceso.Obtener(row["ldvIDPROCESO"].ToInteger()),
                   Activo = row.IsNull("FECHA_BAJA") ? true : false
               };
           }
           catch (Exception ex)
           {
               
               throw;
           }
          
       }
       #endregion
    }
}
